/*
 * @Author: QinJiu
 * @Date: 2022-07-15 11:24:47
 * @LastEditors: Qinjiu
 * @LastEditTime: 2022-07-15 14:00:58
 * @Description: 桌面通知
 * 配置参考 https://developer.mozilla.org/zh-CN/docs/Web/API/notification/Notification
 * title, body, icon, image, requireInteraction等
 */

// 通知持续时间ms
const NOTIFY_DURATION = 3000;

/**
 * 创建桌面通知
 */
export function createDesktopNotify(title = "通知", options = {}) {
  const notification = new Notification(title, options);

  // 监听通知报错
  notification.onerror = () => {
    // 关闭通知
    notification.close();
  };

  // 监听点击通知
  notification.onclick = () => {
    // 关闭通知
    notification.close();
  };

  // 监听通知显示
  notification.onshow = () => {
    // 通知是否自动关闭
    if (!options.requireInteraction) {
      const timer = setTimeout(() => {
        // 关闭通知
        notification.close();
        // 清空定时器
        clearTimeout(timer);
      }, NOTIFY_DURATION);
    }
  };

  return notification;
}

/**
 * 检查桌面通知权限
 */
export function checkDesktopNotifyPermission() {
  // 浏览器支持桌面通知
  if (window.Notification) {
    // Notification.permission granted 允许弹窗 default 默认状态需要通过主动事件触发
    // denied 禁止弹窗 需要在浏览器设置中修改设置
    if (Notification.permission !== "granted") {
      // 如果用户设置启用桌面通知，浏览器没有启用，则提示用户是否启用桌面通知。
      Notification.requestPermission();
    }
  }
}

/**
 * 是否能显示桌面通知
 */
export function canShowDesktopNotify() {
  // 标签页隐藏 && 浏览器支持Notification && 用户同意接收通知
  return (
    // document.hidden &&
    window.Notification && Notification.permission === "granted"
  );
}

/**
 * 显示桌面通知
 */
export function showDesktopNotify(title = "通知", options = {}) {
  if (canShowDesktopNotify()) {
    // 创建桌面通知
    createDesktopNotify(title, options);
  }
}
